Después de ver el AND, queremos modificar el programa que detecta la pertenencia al intervalo 0--1 y cambiarlo para que por pantalla aparezca un 0 cuando estamos dentro y un 1 cuando estamos fuera. Esencialmente le damos la vuelta a la expresión y queremos que devuelva cierto cuando antes devolvía falso y viceversa.
Una forma de empezar el problema es hacer uno parecido al del AND así:
int main() { double x; cin >> x; bool menor_que_0 = x < 0.0; bool mayor_que_1 = x > 1.0; bool fuera = /* combinar las dos variables */; cout << fuera << endl; }
Ahora las variables menor_que_0 y mayor_que_1 nos permiten detectar si el valor x está fuera (por el lado de la izquierda o la derecha). Pero en el momento de combinar los valores, no podemos usar el AND (el operador &&), porque no existen valores reales que a la vez sean menores que 0 y mayores que 1, es imposible.
Si hacemos un diagrama donde pintamos una zona sombreada para indicar los intervalos de números que dan true para cada variable, tendríamos algo como:
En el diagrama se aprecia que lo que nos interesa para obtener el valor de la variable fuera seria la unión de los intervalos menor_que_0 y mayor_que_1.
Se trata entonces de combinar los valores menor_que_0 y mayor_que_1 de forma que si uno de los 2 se cumple, ya se cumpla la expresión entera. Es decir, que x está fuera del intervalo 0-1 es lo mismo que decir que x es menor_que_0 o mayor_que_1. El operador que buscamos es el OR lógico, también llamado disyunción. La tabla siguiente muestra los resultados posibles:
menor_que_0 | mayor_que_1 | fuera |
---|---|---|
false | false | false |
false | true | true |
true | false | true |
true | true | true |
En la tabla aparecen todos los casos, pero nosotros sabemos que el último caso no puede suceder. Los otros son correctos, de todas maneras. Si x es menor que 0, está fuera. Si x es mayor que 1, está fuera. Solamente si menor_que_0 y mayor_que_1 son false podemos decir que está dentro (fuera es false).
El operador OR tiene dos versiones en C++: "||" u "or". Para escribir las barras verticales en un teclado Español moderno, hay que presionar a la vez la tecla "AltGr" y el 1. El dibujo de la barra vertical aparece en el teclado a veces con un agujero enmedio.
El operador OR es contrario al AND en que devuelve false solamente cuando los dos operandos son false (el AND hace lo mismo pero con el true).
Para acabar el programa podemos escribir la asignación que faltava:
int main() { double x; cin >> x; bool menor_que_0 = x < 0.0; bool mayor_que_1 = x > 1.0; bool fuera = menor_que_0 || mayor_que_1; cout << fuera << endl; }
Ahora, al igual que hicimos con el AND, podemos simplificar el programa al máximo poniendo la expresión directamente en el cout y sin utilizar ninguna variable auxiliar:
int main() { double x; cin >> x; cout << (x < 0.0 || x > 1.0) << endl; }
Los paréntesis permiten priorizar correctamente entre el operador || y el operador <<.
Si tenemos las declaraciones
int a = 1, b = 3; char c = 'a', d = 'd'; double x = 0.0, y = 1.2; string s1 = "aab", s2 = "ccd";
evalúa las siguientes expresiones
a < 1 || b > 2 c != 'a' && c != 'd' a == 1 || b == 3 s1 < "aaa" || s1 > "zzz" s1 == s2 || s1 + "b" != "aabb" c == 'z' || d == 'd' a / b == 0 || a % b == 0
Si suponemos que tenemos una variable n de tipo int, qué problema tiene la expresión siguiente?
n == 0 || 1
Qué crees que significa y cómo la arreglarías?
Evalúa las siguientes expresiones (con a y b de tipo int, y c de tipo char) para distintos valores de a, b y c e indica cuál es el problema que observas:
c != 'a' || c != 'b' a < 1 || a > -1 c != 'a' || c == 'a' b < a || b > a
En preparación